// https://leetcode.cn/problems/guess-number-higher-or-lower-ii/

// 题干：我们正在玩一个猜数游戏，游戏规则如下：
//      我从 1 到 n 之间选择一个数字。
//      你来猜我选了哪个数字。
//      如果你猜到正确的数字，就会 赢得游戏 。
//      如果你猜错了，那么我会告诉你，我选的数字比你的 更大或者更小 ，并且你需要继续猜数。
//      每当你猜了数字 x 并且猜错了的时候，你需要支付金额为 x 的现金。如果你花光了钱，就会 输掉游戏 。
//      给你一个特定的数字 n ，返回能够 确保你获胜 的最小现金数，不管我选择那个数字 。

// 示例：输入：n = 10
//       输出：16

// 碎语：

#include <bits/stdc++.h>
using namespace std;

class Solution
{
    int memo[201][201];
public:
    int getMoneyAmount(int n)
    {
        return dfs(1, n); // 给定一个区间，返回能够获胜的最小金额数
    }

    int dfs(int left, int right)
    {
        if (left >= right) return 0;
        if (memo[left][right]) return memo[left][right];

        int ret = INT_MAX;
        for (int head = left ; head <= right ; head++){ // 选择头结点
            int x = dfs(left, head - 1);
            int y = dfs(head + 1, right);
            ret = min(ret, head + max(x, y));
        }
        memo[left][right] = ret;

        return ret;
    }
};

int main()
{
    Solution sol;

    cout << sol.getMoneyAmount(10) << endl;

    return 0;
}